開頭先來做回顧先前講解的重點,在第三天介紹了資料傳遞的方式,第四天則介紹了使用雙引號建立字串值,以及透過String物件建立字串,兩者在背後執行操作的差異,今日第五天來講解Java資料類型,讀完本篇後在回頭觀看前兩天內容,對知識的連結會更緊密
Java主要兩大資料類型
基礎類型(Primitive Types)
屬於在「編譯階段」就設定實際值的資料類型,並且會將實際值存在Stack中,使用此型別的變數會直接保存實際值
基礎類型列表
來段程式碼驗證,基礎型別可以取得實際值
char c1 = 'a';
char c2 = 'a';
// output: v1 == v2
if (c1 == c2) {
System.out.println("c1 == c2");
} else {
System.out.println("c1 != c2");
}
上面程式實作了兩個變數分別賦予字元'a',作為實際值在進行比對的邏輯,並利用 == 將變數值進行相比,在回顧昨日使用String物件比較實際值的方式,結尾有提到重寫了equals方法,就是利用了基礎類型的char,將實際值逐一比對,來驗證兩個String物件是否相等,說白話點就是,活用基礎類型直接取得實際值的特性,實現了相等值的判斷
引用類型(Refrence Types)
講到引用就能跟記憶體進行聯想,與基礎類型最大的差異在於,使用引用類型的變數,資料主體會變成記憶體的位置,將其作為變數值進行保存,此處的「引用」可以理解為,變數會從別的記憶體位置對實際值的資料進行存取,這種操作資料的方式,就是Day3提到的傳值方式進行資料傳遞,現在來複習傳值用法
// 引用類型的傳值
Student stuA = new Student();
Student stuB = stuA;
stuA.setName("Bob");
System.out.printf("StuA:%s StuB:%s \n", stuA.getName(), stuB.getName());
// output: StuA:Bob StuB:Bob
stuA.setName("Tom");
System.out.printf("StuA:%s StuB:%s \n", stuA.getName(), stuB.getName());
// output: StuA:Tom StuB:Tom
// 基礎類型的傳值
int a = 10;
int b = a;
System.out.printf("a:%d b:%d \n", a, b);
// output: a:10 b:10
a = 60;
System.out.printf("a:%d b:%d \n", a, b);
// output: a:60 b:10
觀察輸出結果,可以發現第一個引用類型的傳值,會將引用值的記憶體位置「傳遞給」接收的變數,因此當變數取得值時,會從「引用的記憶體位置」取得實際資料,在往下看基礎類型的傳值操作,可以知道當變數a賦值給變數 b 時,此時變數b的值為10,接著將變數a修改值為60,變數b依舊原先的10,不受任何影響,最後可以得知結論,引用類型是保存目標「實際的記憶體位置」,基礎型別則是紀錄實際資料值
引用